package br.unicamp.ic.inf300.arena.modelo.pessoa;

import java.util.Date;

import br.unicamp.ic.inf300.framework.util.DataUtil;

public class Pessoa {
	
	private Integer id;

	private Date dataNascimento;

	private String documento;

	private String nome;

	private TipoPessoa tipoPessoa; 

	//--
	public Pessoa() {}
	
	/**
	 * 
	 * @param documento
	 */
	public Pessoa(String documento) {
		super();
		this.documento = documento;
	}

	/**
	 * 
	 * @param dataNascimento
	 * @param documento
	 * @param nome
	 */
	public Pessoa(Date dataNascimento, String documento, String nome) {
		super();
		this.dataNascimento = dataNascimento;
		this.documento = documento;
		this.nome = nome;
	}
	
	public Pessoa(Integer id, String nome, String documento, Date dataNascimento, TipoPessoa tipoPessoa) {
		setId(id);
		setNome(nome);
		setDocumento(documento);
		setDataNascimento(dataNascimento);
		setTipoPessoa(tipoPessoa);
	}
	
	public Pessoa(Pessoa pessoa) {
		this(pessoa.getId(), pessoa.getNome(), pessoa.getDocumento(), pessoa.getDataNascimento(), pessoa.getTipoPessoa());
	}
	
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getDataNascimentoView() {
		return dataNascimento != null ? DataUtil.formatarData(DataUtil.DATE, dataNascimento) : "";
	}
	
	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getDocumento() {
		return documento;
	}

	public void setDocumento(String documento) {
		this.documento = documento;
	}

	public TipoPessoa getTipoPessoa() {
		return tipoPessoa;
	}

	public void setTipoPessoa(TipoPessoa tipo) {
		this.tipoPessoa = tipo;
	}

	/**
	 * @return <code>String</code>
	 * JUtils plugin ;-)
	 */
	public String toString()
	{
	    final String TAB = "    ";
	    
	    StringBuffer retValue = new StringBuffer();
	    
	    retValue.append("Pessoa ( ")
	        .append(super.toString()).append(TAB)
	        .append("dataNascimento = ").append(this.dataNascimento).append(TAB)
	        .append("documento = ").append(this.documento).append(TAB)
	        .append("id = ").append(this.id).append(TAB)
	        .append("nome = ").append(this.nome).append(TAB)
	        .append("tipoPessoa = ").append(this.tipoPessoa).append(TAB)
	        .append(" )");
	    
	    return retValue.toString();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((dataNascimento == null) ? 0 : dataNascimento.hashCode());
		result = prime * result
				+ ((documento == null) ? 0 : documento.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result
				+ ((tipoPessoa == null) ? 0 : tipoPessoa.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Pessoa other = (Pessoa) obj;
		if (dataNascimento == null) {
			if (other.dataNascimento != null)
				return false;
		} else if (!dataNascimento.equals(other.dataNascimento))
			return false;
		if (documento == null) {
			if (other.documento != null)
				return false;
		} else if (!documento.equals(other.documento))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (tipoPessoa == null) {
			if (other.tipoPessoa != null)
				return false;
		} else if (!tipoPessoa.equals(other.tipoPessoa))
			return false;
		return true;
	}
}